﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cwtrock.model;
using System.Data;
using cwtrock.util;
using System.Data.SqlClient;

namespace cwtrock.dao.impl
{
    class VrecordsDaoImpl : BasicDaoImpl
    {
        private GetConn getConn = new GetConn();

        public int save(Vrecords vrecord) {

            try
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("INSERT INTO [cwtrock].[dbo].[VRECORDS]");
                strSql.Append("([VID]");
                strSql.Append(",[VR_DIGEST]");
                strSql.Append(",[ACCT_CODE]");
                strSql.Append(",[ACCT_NAME]");
                strSql.Append(",[VR_BAMOUNT]");
                strSql.Append(",[VR_LAMOUNT]");
                strSql.Append(",[V_MAKERID] ");
                strSql.Append(",[V_MAKER] ");
                strSql.Append(",[V_CHECKERID] ");
                strSql.Append(",[V_CHECKER]");
                strSql.Append(",[V_POSTERID] ");
                strSql.Append(",[V_POSTER]");                
                strSql.Append(",[V_CHECKSTAT] ");
                strSql.Append(",[V_POSTSTAT]");
                strSql.Append(",[V_CLOSEDSTAT])");

                strSql.Append("VALUES");
                strSql.Append("( @vid   ");
                strSql.Append(",@vr_digest ");
                strSql.Append(",@acct_code ");
                strSql.Append(",@acct_name ");
                strSql.Append(",@vr_bamount ");
                strSql.Append(",@vr_lamount ");
                strSql.Append(",@v_makerid   ");
                strSql.Append(",@v_maker     ");
                strSql.Append(",@v_checkerid ");
                strSql.Append(",@v_checker   ");
                strSql.Append(",@v_posterid  ");
                strSql.Append(",@v_poster    ");                
                strSql.Append(",@v_checkstat ");
                strSql.Append(",@v_poststat  ");
                strSql.Append(",@v_closedstat )");


                SqlParameter[] parameters = {
                    new SqlParameter("@vid"      ,SqlDbType.BigInt),
                    new SqlParameter("@vr_digest"  ,SqlDbType.VarChar,50),
                    new SqlParameter("@acct_code" ,SqlDbType.VarChar,50),
                    new SqlParameter("@acct_name" ,SqlDbType.VarChar,50),
                    new SqlParameter("@vr_bamount" ,SqlDbType.Decimal),
                    new SqlParameter("@vr_lamount" ,SqlDbType.Decimal),
                    new SqlParameter("@v_makerid" ,SqlDbType.VarChar),
                    new SqlParameter("@v_maker" ,SqlDbType.VarChar),
                    new SqlParameter("@v_checkerid" ,SqlDbType.VarChar),
                    new SqlParameter("@v_checker" ,SqlDbType.VarChar),
                    new SqlParameter("@v_posterid" ,SqlDbType.VarChar),
                    new SqlParameter("@v_poster" ,SqlDbType.VarChar),                   
                    new SqlParameter("@v_checkstat" ,SqlDbType.VarChar),
                    new SqlParameter("@v_poststat" ,SqlDbType.VarChar),       
                    new SqlParameter("@v_closedstat" ,SqlDbType.VarChar)
                                             
              };

                int i = 0;
                parameters[i++].Value = vrecord.Vid;
                parameters[i++].Value = vrecord.Vrdigest;
                parameters[i++].Value = vrecord.Acctcode;
                parameters[i++].Value = vrecord.Acctname;
                parameters[i++].Value = vrecord.Vrbamount;
                parameters[i++].Value = vrecord.Vrlamount;
                parameters[i++].Value = vrecord.Vmakerid;
                parameters[i++].Value = vrecord.Vmaker;
                parameters[i++].Value = vrecord.Vcheckerid;
                parameters[i++].Value = vrecord.Vchecker;
                parameters[i++].Value = vrecord.Vposterid;
                parameters[i++].Value = vrecord.Vposter;
                parameters[i++].Value = vrecord.Vcheckstat;
                parameters[i++].Value = vrecord.Vpoststat;
                parameters[i++].Value = vrecord.Vclosedstat;

                int j = 0;
                SqlCommand cmd = new SqlCommand(strSql.ToString(), getConn.GetCon());
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);

                int rows = cmd.ExecuteNonQuery();

                return rows;
            }
            catch (Exception e)
            {
                throw e;
                return 0;
            }
        
        }
       
        public List<Vrecords> getVrecordsByCondition(Vouchers vou) {

            try
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("SELECT [ID]");
                strSql.Append(",[VID]");
                strSql.Append(",[VR_DIGEST]");
                strSql.Append(",[ACCT_CODE]");
                strSql.Append(",[ACCT_NAME]");
                strSql.Append(",[VR_BAMOUNT]");
                strSql.Append(",[VR_LAMOUNT]");
                strSql.Append(",[V_MAKERID]");
                strSql.Append(",[V_MAKER]");
                strSql.Append(",[V_CHECKERID]");
                strSql.Append(",[V_CHECKER]");
                strSql.Append(",[V_POSTER]");
                strSql.Append(",[V_POSTERID]");
                strSql.Append(",[V_CHECKSTAT]");
                strSql.Append(",[V_POSTSTAT]");
                strSql.Append(",[V_CLOSEDSTAT]");
                strSql.Append("FROM [cwtrock].[dbo].[VRECORDS]");
                strSql.Append(" WHERE [V_MAKERID] = @userid");


                if (!(vou.Vpoststat.Equals("0")))
                    strSql.Append(" AND [V_POSTSTAT] = @v_poststat");
                if (!(vou.Vclosedstat.Equals("0")))
                    strSql.Append(" AND [V_CLOSEDSTAT] = @v_closedstat");
                 strSql.Append(" ORDER BY id ");

                 SqlParameter[] parameters = { 
                    new SqlParameter("@userid", SqlDbType.VarChar,50),
                    new SqlParameter("@v_poststat", SqlDbType.VarChar,1),
                    new SqlParameter("@v_closedstat", SqlDbType.VarChar,1),
                                           
             };
                 int i = 0;
                 parameters[i++].Value = vou.Vmakerid;
                 parameters[i++].Value = vou.Vpoststat;
                 parameters[i++].Value = vou.Vclosedstat;

                 SqlCommand cmd = new SqlCommand(strSql.ToString(), getConn.GetCon());

                 int j = 0;
                 cmd.Parameters.Add(parameters[j++]);
                 cmd.Parameters.Add(parameters[j++]);
                 cmd.Parameters.Add(parameters[j++]);

                 SqlDataReader reader = cmd.ExecuteReader();
                 List<Vrecords> vrecordls = new List<Vrecords>();

                 while (reader.Read())
                 {
                     Vrecords vr = new Vrecords();
                     string id = reader[0].ToString();
                     string vid = reader[1].ToString();
                     string digest = reader[2].ToString();
                     string acctcode = reader[3].ToString();
                     string acctname = reader[4].ToString();
                     string bamount = reader[5].ToString();
                     string lamount = reader[6].ToString();

                     vr.Id = long.Parse(id);
                     vr.Vid = long.Parse(vid);
                     vr.Vrdigest = digest;
                     vr.Vrbamount = Decimal.Parse(bamount);
                     vr.Vrlamount = Decimal.Parse(lamount);
                     vr.Acctcode = acctcode;
                     vr.Acctname = acctname;


                     vrecordls.Add(vr);

                 }

                 cmd.Parameters.Clear();
                 return vrecordls;

            }
            catch (Exception e) {
                throw e;
                return null;
            }
        }

        // 更新
        public int update(Vrecords vrecord)
        {
            try
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("UPDATE [VRECORDS]");
                strSql.Append("SET [VID] = @vid");
                strSql.Append(",[VR_DIGEST] = @vr_digest");
                strSql.Append(",[ACCT_CODE] = @acct_code ");
                strSql.Append(",[ACCT_NAME] = @acct_name");
                strSql.Append(",[VR_BAMOUNT] = @vr_bamount ");
                strSql.Append(",[VR_LAMOUNT] = @vr_lamount");
                strSql.Append(",[V_MAKERID] = @v_makerid");
                strSql.Append(",[V_MAKER] = @v_maker");
                strSql.Append(",[V_CHECKERID] = @v_checkerid");
                strSql.Append(",[V_CHECKER] =@v_checker");
                strSql.Append(",[V_POSTER] = @v_poster");
                strSql.Append(",[V_POSTERID] = @v_posterid");
                strSql.Append(",[V_CHECKSTAT] = @v_checkstat ");
                strSql.Append(",[V_POSTSTAT] = @v_poststat ");
                strSql.Append(",[V_CLOSEDSTAT] = @v_closedstat ");
                strSql.Append("  WHERE [ID] = @id ");


                SqlParameter[] parameters = {
                    new SqlParameter("@vid"      ,SqlDbType.BigInt),
                    new SqlParameter("@vr_digest"  ,SqlDbType.VarChar,50),
                    new SqlParameter("@acct_code" ,SqlDbType.VarChar,50),
                    new SqlParameter("@acct_name" ,SqlDbType.VarChar,50),
                    new SqlParameter("@vr_bamount" ,SqlDbType.Decimal),
                    new SqlParameter("@vr_lamount" ,SqlDbType.Decimal),
                    new SqlParameter("@v_makerid" ,SqlDbType.VarChar),
                    new SqlParameter("@v_maker" ,SqlDbType.VarChar),
                    new SqlParameter("@v_checkerid" ,SqlDbType.VarChar),
                    new SqlParameter("@v_checker" ,SqlDbType.VarChar),
                    new SqlParameter("@v_posterid" ,SqlDbType.VarChar),
                    new SqlParameter("@v_poster" ,SqlDbType.VarChar),                   
                    new SqlParameter("@v_checkstat" ,SqlDbType.VarChar),
                    new SqlParameter("@v_poststat" ,SqlDbType.VarChar),       
                    new SqlParameter("@v_closedstat" ,SqlDbType.VarChar),
                    new SqlParameter("@id"      ,SqlDbType.BigInt),
                                             
              };

                int i = 0;
                parameters[i++].Value = vrecord.Vid;
                parameters[i++].Value = vrecord.Vrdigest;
                parameters[i++].Value = vrecord.Acctcode;
                parameters[i++].Value = vrecord.Acctname;
                parameters[i++].Value = vrecord.Vrbamount;
                parameters[i++].Value = vrecord.Vrlamount;
                parameters[i++].Value = vrecord.Vmakerid;
                parameters[i++].Value = vrecord.Vmaker;
                parameters[i++].Value = vrecord.Vcheckerid;
                parameters[i++].Value = vrecord.Vchecker;
                parameters[i++].Value = vrecord.Vposterid;
                parameters[i++].Value = vrecord.Vposter;
                parameters[i++].Value = vrecord.Vcheckstat;
                parameters[i++].Value = vrecord.Vpoststat;
                parameters[i++].Value = vrecord.Vclosedstat;
                parameters[i++].Value = vrecord.Id;

                int j = 0;
                SqlCommand cmd = new SqlCommand(strSql.ToString(), getConn.GetCon());
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);

                int rows = cmd.ExecuteNonQuery();

                return rows;
            }catch(Exception ex){
                throw ex;
                return 0;
            }
        }

        public List<Vrecords> getVrecordsBetween(Vrecords vrecord_begin, Vrecords vrecord_end)
        {
            try
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("SELECT [ID]");
                strSql.Append(",[VID]");
                strSql.Append(",[VR_DIGEST]");
                strSql.Append(",[ACCT_CODE]");
                strSql.Append(",[ACCT_NAME]");
                strSql.Append(",[VR_BAMOUNT]");
                strSql.Append(",[VR_LAMOUNT]");
                strSql.Append(",[V_MAKERID]");
                strSql.Append(",[V_MAKER]");
                strSql.Append(",[V_CHECKERID]");
                strSql.Append(",[V_CHECKER]");
                strSql.Append(",[V_POSTER]");
                strSql.Append(",[V_POSTERID]");
                strSql.Append(",[V_CHECKSTAT]");
                strSql.Append(",[V_POSTSTAT]");
                strSql.Append(",[V_CLOSEDSTAT]");
                strSql.Append("FROM [cwtrock].[dbo].[VRECORDS]");
                strSql.Append(" WHERE [V_MAKERID] = @userid");


                if (SimpleTool.isNotEmpty(vrecord_begin.Acctcode) )
                    strSql.Append(" AND CONVERT(INT,SUBSTRING([ACCT_CODE],0,4)) >= CONVERT(INT,SUBSTRING(@acct_code_begin,0,4))");
                if (SimpleTool.isNotEmpty(vrecord_end.Acctcode))
                    strSql.Append(" AND SUBSTRING([ACCT_CODE],0,@end_len) <= @acct_code_end");
                if (vrecord_begin.Vid != null)
                    strSql.Append(" AND [VID] >= @vid_begin");
                if (vrecord_end.Vid != null)
                    strSql.Append(" AND [VID] <= @vid_end");

                strSql.Append(" ORDER BY [ACCT_CODE], [VID]");

                SqlParameter[] parameters = { 
                    new SqlParameter("@userid", SqlDbType.VarChar,50),
                    new SqlParameter("@acct_code_begin", SqlDbType.VarChar,50),
                    new SqlParameter("@acct_code_end", SqlDbType.VarChar,50),
                    new SqlParameter("@vid_begin", SqlDbType.VarChar,50),
                    new SqlParameter("@vid_end", SqlDbType.VarChar,50),
                    new SqlParameter("@end_len", SqlDbType.Int),
                                           
             };
                int i = 0;
                parameters[i++].Value = vrecord_begin.Vmakerid;
                parameters[i++].Value = SimpleTool.isEmpty(vrecord_begin.Acctcode) ? "0" : vrecord_begin.Acctcode;
                parameters[i++].Value = SimpleTool.isEmpty(vrecord_end.Acctcode) ?"0" : vrecord_end.Acctcode;
                parameters[i++].Value = vrecord_begin.Vid;
                parameters[i++].Value = vrecord_end.Vid;
                parameters[i++].Value = SimpleTool.isEmpty(vrecord_end.Acctcode) ? 0 : vrecord_end.Acctcode.Length;

                SqlCommand cmd = new SqlCommand(strSql.ToString(), getConn.GetCon());

                int j = 0;
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);
                cmd.Parameters.Add(parameters[j++]);

                SqlDataReader reader = cmd.ExecuteReader();
                List<Vrecords> vrecordls = new List<Vrecords>();

                while (reader.Read())
                {
                    Vrecords vr = new Vrecords();
                    string id = reader[0].ToString();
                    string vid = reader[1].ToString();
                    string digest = reader[2].ToString();
                    string acctcode = reader[3].ToString();
                    string acctname = reader[4].ToString();
                    string bamount = reader[5].ToString();
                    string lamount = reader[6].ToString();

                    vr.Id = long.Parse(id);
                    vr.Vid = long.Parse(vid);
                    vr.Vrdigest = digest;
                    vr.Vrbamount = Decimal.Parse(bamount);
                    vr.Vrlamount = Decimal.Parse(lamount);
                    vr.Acctcode = acctcode;
                    vr.Acctname = acctname;


                    vrecordls.Add(vr);

                }

                cmd.Parameters.Clear();
                return vrecordls;

            }
            catch (Exception e)
            {
                throw e;
                return null;
            }
        }
    
    }
}
